package org.wechat.count.conn;

import java.util.List;
import java.util.TreeMap;

import org.wechat.common.conn.Connection;
import org.wechat.common.entity.results.WechatResult;
import org.wechat.count.entity.InterAnlyseEntity;
import org.wechat.count.entity.MsgAnalyseEntity;
import org.wechat.count.entity.NewsAnlyseEntity;
import org.wechat.count.entity.UserAnlyseEntity;

import com.alibaba.fastjson.JSONObject;

/**
 * 统计数据api (已经测试通过)
 * @author Andy
 * 
 */
public class CountConn extends Connection {
	private final String USER="user";			//用户实体返回的标识
	private final String NEWS="news";			//图文实体标识
	private final String INF="interface";		//接口实体标识
	private final String MSG="msg";				//消息实体标识
	
	
	// 用户分析接口获取用户增减数据 (跨度 7 天)
	private String getUsersummary ="https://api.weixin.qq.com/datacube/getusersummary";
	// 获取累计用户数据(跨度 7 天)
	private String getUsercumulate="https://api.weixin.qq.com/datacube/getusercumulate";
	
	
	/*************图文分析****************/
	//获取图文群发每日数据(跨度 1天)
	private String getarticlesummary="https://api.weixin.qq.com/datacube/getarticlesummary";
	//图文群发总数据(跨度 1 天)
	private String getarticletotal="https://api.weixin.qq.com/datacube/getarticletotal";
	//获取图文统计数据(跨度 3 天)
	private String getuserread = "https://api.weixin.qq.com/datacube/getuserread";
	//获取图文统计分时数据(跨度 1 天)
	private String getuserreadhour="https://api.weixin.qq.com/datacube/getuserreadhour";
	//获取图文分享数据 (跨度 7天)
	private String getusershare = "https://api.weixin.qq.com/datacube/getusershare";
	//获取图文分享转发分时数据(跨度 1 天)
	private String getusersharehour="https://api.weixin.qq.com/datacube/getusersharehour"; 	
	
	/*********************接口分析数据接口*****************/
	//获取接口分析数据 (跨度 30 天)
	private String getinterfacesummary="https://api.weixin.qq.com/datacube/getinterfacesummary";
	//获取接口分析分时数据
	private String getinterfacesummaryhour="https://api.weixin.qq.com/datacube/getinterfacesummaryhour";
	
	/*********************消息数据分析接口*****************/
	//获取消息发送概况数据(跨度 7 天)
	private String getupstreammsg="https://api.weixin.qq.com/datacube/getupstreammsg";
	//获取消息分送分时数据(跨度 1 天)
	private String getupstreammsghour="https://api.weixin.qq.com/datacube/getupstreammsghour";
	//获取消息发送周数据 (跨度 30 天)	
	private String getupstreammsgweek="https://api.weixin.qq.com/datacube/getupstreammsgweek";
	//获取消息发送月数据(跨度 30 天)
	private String getupstreammsgmonth="https://api.weixin.qq.com/datacube/getupstreammsgmonth";
	//获取消息发送分布数据 (跨度 15天)
	private String getupstreammsgdist="https://api.weixin.qq.com/datacube/getupstreammsgdist";
	//获取消息发送分布周数据(跨度 30天)
	private String getupstreammsgdistweek="https://api.weixin.qq.com/datacube/getupstreammsgdistweek";
	//获取消息发送分布月数据(跨度 30天)
	private String getupstreammsgdistmonth="https://api.weixin.qq.com/datacube/getupstreammsgdistmonth";
	

	/**
	 * 获取消息发送分布月数据(时间跨度为30天)
	 * @param accessToken	授权token
	 * @param startString     开始日期
	 * @param endString		结束日期 
	 * @return 判断Result中的isSuccess List
	 * 	如果为true,则可强制为MsgAnalyseEntity对象
	 */
	public WechatResult getupstreammsgdistmonth(String accessToken,String startDate,String endDate){
		return baseMethod(getupstreammsgdistmonth,accessToken,startDate,endDate,MSG);
	}
	/**
	 *获取消息发送分布周数据(30天)
	 * @param accessToken	授权token
	 * @param startString     开始日期
	 * @param endString		结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为List<MsgAnalyseEntity>
	 */
	public WechatResult getupstreammsgdistweek(String accessToken,String startDate,String endDate){
		return baseMethod(getupstreammsgdistweek,accessToken,startDate,endDate,MSG);
	}
	/**
	 * 获取消息发送分布数据 (15天)
	 * @param accessToken	授权token
	 * @param startString     开始日期
	 * @param endString		结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为List<MsgAnalyseEntity>
	 */
	public WechatResult getupstreammsgdist(String accessToken,String startDate,String endDate){
		return baseMethod(getupstreammsgdist,accessToken,startDate,endDate,MSG);
	}
	/**
	 * 获取消息发送月数据(跨度 30 天)
	 * @param accessToken	授权token
	 * @param startString     开始日期
	 * @param endString		结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为List<MsgAnalyseEntity>
	 */
	public WechatResult getupstreammsgmonth(String accessToken,String startDate,String endDate){
		return baseMethod(getupstreammsgmonth,accessToken,startDate,endDate,MSG);
	}
	/**
	 * 获取消息发送周数据 (跨度 30 天)
	 * @param accessToken	授权token
	 * @param startString     开始日期
	 * @param endString		结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为List<MsgAnalyseEntity>
	 */
	public WechatResult getupstreammsgweek(String accessToken,String startDate,String endDate){
		return baseMethod(getupstreammsgweek,accessToken,startDate,endDate,MSG);
	}
	
	/**
	 * 获取消息发送概况数据(跨度 7 天)
	 * 获取消息发送的概况数据
	 * @param accessToken	授权token
	 * @param startString     开始日期
	 * @param endString		结束日期
	 * @return  判断Result中的isSuccess 
	 * 		如果为true,则可强制转换为List<MsgAnalyseEntity>
	 */
	public WechatResult getupstreammsg(String accessToken,String startDate,String endDate){
		return baseMethod(getupstreammsg,accessToken,startDate,endDate,MSG);
	}
	/**
	 * 获取消息分送分时数据
	 * 获取消息分送分时数据(跨度 1 天)
	 * @param accessToken	授权token
	 * @param startString     开始日期
	 * @param endString		结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为List<MsgAnalyseEntity>
	 */
	public WechatResult getupstreammsghour(String accessToken,String startDate,String endDate){
		return baseMethod(getupstreammsghour,accessToken,startDate,endDate,MSG);
	}
	/**
	 *  获取接口分析数据 (跨度 30 天)
	 * @param accessToken  授权token
	 * @param startString	   开始日期
	 * @param endString	   结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为InterAnlyseEntity 的List集合
	 */
	public WechatResult getinterfacesummary(String accessToken,String startDate,String endDate){
		return baseMethod(getinterfacesummary,accessToken,startDate,endDate,INF);
	}
	
	/**
	 * 获取接口分析分时数据(跨度 1 天)
	 * @param accessToken  授权token
	 * @param startString	   开始日期
	 * @param endString	 结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为InterAnlyseEntity 的List集合
	 */
	public WechatResult getinterfacesummaryhour(String accessToken,String startDate,String endDate){
		return baseMethod(getinterfacesummaryhour,accessToken,startDate,endDate,INF);
	}
	
	
	/**
	 * 获取图文统计分时数据
	 * @param accessToken	授权token
	 * @param startString		开始时间	
	 * @param endString		结束时间
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为NewsAnlyseEntity 的List集合
	 */ 
	public WechatResult getArticleuserreadhour(String accessToken,String startDate,String endDate){
		return baseMethod(getuserreadhour,accessToken,startDate,endDate,NEWS);
	}
	
	/**
	 * 获取图文分享数据(时间跨度为 7天)
	 * @param accessToken	授权token
	 * @param startString		开始时间
	 * @param endString		结束时间
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为NewsAnlyseEntity 的List集合
	 */
	public WechatResult getArticleusershare(String accessToken,String startDate,String endDate){
		return baseMethod(getusershare,accessToken,startDate,endDate,NEWS);
	}
	
	/**
	 * 获取图文分享转发分时数据(时间跨度为 1天)
	 * @param accessToken   授权token
	 * @param startString		开始日期
	 * @param endString		结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为List<MsgAnalyseEntity>
	 */
	public WechatResult getArticleusersharehour(String accessToken,String startDate,String endDate){
		return baseMethod(getusersharehour,accessToken,startDate,endDate,NEWS);
	}
	
	
	/**
	 * 获取图文统计数据接口(时间跨度为3天)
	 * @param accessToken	授权token
	 * @param startString	   开始日期
	 * @param endString	结束日期
	 * @return  判断Result中的isSuccess 如果为true,则可强制转换为NewsAnlyseEntity
	 */
	public WechatResult getArticleUserread(String accessToken,String startDate,String endDate){
		return baseMethod(getuserread,accessToken,startDate,endDate,NEWS);
	}
	
	
	/**
	 * 获取图文群发每日数据(日期跨度为 1 天)
	 * @param accessToken	授权token
	 * @param startString	    开始日期
	 * @param endString	  结束日期
	 * @return   result.iscusse==true时,可强制转换为 NewsAnlyseEntity 集合
	 */
	public WechatResult getArticlesummary(String accessToken,String startDate,String endDate){
		return baseMethod(getarticlesummary,accessToken,startDate,endDate,NEWS);
	}
	
	/**
	 * 获取图文群发总数据		跨度为(1 天)
	 * @param accessToken	授权token
	 * @param startString		开始日期
	 * @param endString		结束日期
	 * @return   result.isSuccess为true时,可强制转换为NewsAnlyseEntity 的list集合
	 */
	public WechatResult getArticletotal(String accessToken,String startDate,String endDate){
		return baseMethod(getarticletotal,accessToken,startDate,endDate,NEWS);
	}
	
	
	/**
	 * 用户分析接口
	 * 
	 * @param accessToken
	 *            授权token
	 * @param startString
	 *            开始日期
	 * @param endString
	 *            结束日期
	 *            @return result.issuccess为true时,可强制转换为UserAnlyseEntity 集合
	 */
	public WechatResult getUserSummary(String accessToken, String startDate,
			String endDate) {
		return baseMethod(getUsersummary,accessToken,startDate,endDate,USER);
	}

	/**
	 * 获取累计用户数据
	 * (跨度为 7 天)
	 * @param accessToken
	 *            授权token
	 * @param startString
	 *            开始统计的开始日期
	 * @param endString
	 *            开始统计的结束日期
	 * @return  统计数据的	result.issuccess为true时,可强制转换为UserAnlyseEntity 集合
	 */
	public WechatResult getUsercumulate(String accessToken, String startDate,
			String endDate) {
		return baseMethod(getUsercumulate,accessToken,startDate,endDate,USER);
	}
	
	/**
	 * 通过传入不同的api 获取不同的数据
	 * @param path  api的类型不同传入不同的api
	 * @param accessToken 授权码
	 * @param startString  开始日期
	 * @param endString	 结束日期
	 * @param type 		消息类型
	 */
	private WechatResult baseMethod(String path,String accessToken,String startDate,String endDate,String type){
		String result = "";
		WechatResult resultObj = null;
		//url参数
		TreeMap<String, String> params = new TreeMap<String, String>();
		params.put("access_token", accessToken);
		//post参数map
		TreeMap<String,String> data = new TreeMap<String,String>();
		data.put("begin_date", startDate);
		data.put("end_date", endDate);
		String paramsData = JSONObject.toJSONString(data);
		result = HttpsDefaultExecute("POST", path, params, paramsData);
		if(type.equals(USER)){				//转换为用户实体
			resultObj =ConvertEntity(result,UserAnlyseEntity.class);
		}else if(type.equals(NEWS)){		//返回图文实体
			resultObj = ConvertEntity(result,NewsAnlyseEntity.class);
		}else if(type.equals(INF)){			//返回接口实体类型
			resultObj =ConvertEntity(result,InterAnlyseEntity.class);
		}else if(type.equals(MSG)){			//消息实体类型
			resultObj =ConvertEntity(result,MsgAnalyseEntity.class);
		}else{
			resultObj = new WechatResult();
			resultObj.setObj("msg type not exist");
		}
		return resultObj;
	}
	
	
	
	
	/**
	 * 将json格式的字符串转换为 消息分析对象
	 * @param jsonData	json格式的数据
	 * @return		success如果true 则可强制转换为List<MsgAnalyseEntity>  否则为error Info
	 */
	private WechatResult ConvertEntity(String jsonData,Class T){
		WechatResult result = new WechatResult();
		List<MsgAnalyseEntity> list = null;
		if(jsonData!=null&&!"".equals(jsonData)){
			JSONObject jsonObj = JSONObject.parseObject(jsonData);
			if(jsonObj.containsKey("list")){			//判断是否返回正确的结果
				String jsonArray = jsonObj.getString("list").toString();
				list = JSONObject.parseArray(jsonArray,T);
				if(list!=null&&list.size()>0){
					result.setSuccess(true);
					result.setObj(list);
				}else{
					result.setObj("list is null");
				}
			}else{
				result.setObj(jsonData);
			}
		}else{
			result.setObj("params is null");
		}
		return result;
	}
}
